CloudFormation에서 Join 내장 함수에 대해
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 CloudFormation에서 Join 내장 함수에 대해 정리해 봤습니다.
Join 내장 함수?
Join 내장 함수는 다음과 같은 형식으로 사용할 수 있습니다.
Fn::Join: [ delimiter, [ comma-delimited list of values ] ] !Join [ delimiter, [ comma-delimited list of values ] ]
Fn::Join 혹은 !Join으로 사용할 수 있습니다.
※ 설명은 YAML 코드 기준으로 설명합니다.
그렇다면 Join 내장 함수는 언제 사용할까요? AWS 공식 문서를 확인해 보면 다음과 같습니다.
지정된 구분 기호로 구분된 값 세트를 단일 값에 추가합니다. 구분 기호가 빈 문자열이면 값 세트는 구분 기호 없이 연결됩니다.
AWS 공식 문서를 확인해 보면, 지정된 구분 기호로 구분된 값 세트를 단일 값에 추가한다고 설명하고 있습니다.
이게 무슨 의미인지 보다 명확한 예시를 살펴보겠습니다.
AWS:SourceArn”: “arn:aws:cloudfront::<AWS 계정 ID>:distribution/<CloudFront distribution ID>
Amazon CloudFront의 OAC를 사용하기 위해서는 Amazon S3의 버킷 정책에 AWS 계정 ID와 CloudFront 배포 ID를 입력할 필요가 있습니다.
이렇게 보면 AWS 계정 ID와 CloudFront 배포 ID를 직접 입력하면 해결될 문제 아닌가? 라고 생각은 하지만, 직접적으로 값을 입력하는 하드 코딩 방식은 피하고 싶으며, 해당 CloudFormation 코드로 스택을 생성하면, 스택에 AWS 계정 ID가 표시되어 이러한 노출은 피하고 싶습니다.
!sub ${AWS::AccountId}
이럴 때는 AWS 계정 ID를 직접 사용하지 않아도 !sub로 현재 AWS 계정의 ID를 불러올 수 있습니다.
하지만, CloudFront 배포 ID도 불러오기 위해서는 !Ref와 같은 내장 함수를 사용해야합니다. 그렇다면 !Sub와 !Ref가 같은 줄에 작성이 되어 에러가 발생할 것입니다.
이 때 Join 내장 함수를 사용한다면 문제를 해결할 수 있습니다.
- !Join - '' - - !Sub 'arn:aws:cloudfront::${AWS::AccountId}:distribution/' - !Ref CloudFrontDistribution
Join 내장 함수를 선언하고 해당 내장 함수에 !Sub와 !Ref를 사용한다면 AWS 계정 ID와 CloudFront 배포 ID를 불러올 수 있습니다. 이렇듯 Join 내장 함수는 정의한 리소스의 반환값을 이용할 때 사용할 수 있습니다.
그 외, AWS 공식 문서에서 설명하고 있는 예제는 아래를 참고해 주세요.
지원되는 함수는?
Join 내장 함수에서 사용할 수 있는 함수는 다음과 같습니다.
- Fn::Base64
- Fn::FindInMap
- Fn::GetAtt
- Fn::GetAZs
- Fn::If
- Fn::ImportValue
- Fn::Join
- Fn::Split
- Fn::Select
- Fn::Sub
- Ref
본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 [email protected]로 보내주시면 감사하겠습니다.